package main

import "fmt"

func isValid(s string) bool {
	if len(s)%2 == 1 {
		return false
	}
	mp := map[string]string{
		")": "(",
		"}": "{",
		"]": "[",
	}
	length := len(s)
	// 空数组（栈）
	stack := []string{}
	for i := 0; i < length; i++ {
		cur := string(s[i])
		// fmt.Println("当前=", cur, ";匹配内容=", mp[cur], ";当前栈大小=", len(stack), ";栈=", stack, ";当前 i=", i)
		if mp[cur] != "" && len(stack) > 0 {
			if stack[len(stack)-1] != mp[cur] {
				return false
			}
			// 弹出站
			stack = stack[:len(stack)-1]
			// fmt.Println("弹出栈=", stack)
		} else {
			stack = append(stack, cur)
		}
	}
	if len(stack) == 0 {
		return true
	}
	return false

}

// 基本思路：提前定好匹配关系，然后遍历字符串，遇到左括号入栈（map 没有值），遇到右括号出栈（有值），匹配不上就返回 false
func main() {
	fmt.Println(isValid("()"))
}
